package com.webserver.core;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import com.webserver.annotation.Controller;
import com.webserver.annotation.RequestMapping;
import com.webserver.controller.ArticleController;
import com.webserver.controller.ToolsController;
import com.webserver.controller.UserController;
import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;

import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

/**
 * 用来完成处理请求的环节
 */
public class DispatcherServlet {
    public void service(HttpServletRequest request, HttpServletResponse response) {
//        String path = request.getUri();//不再适用,因为当抽象路径含有参数时,参数的值是不固定的
        String path = request.getRequestURI();
        System.out.println("请求的抽象路径:"+path);
        //首先判断是否为请求一个业务处理
/*
            1:扫描com/webserver/controller目录,并将所有的.class文件获取回来
            并根据文件名截取类名利用反射加载回来

            2:判断该类是否被@Controller标注,是的话则获取该类中定义的所有方法

            3:每个方法先判断是否被@RequestMapping标注过,若被标注,则获取这个注解
              并得到value的值(@RquestMapping("这个值"))
            4:根据value值判断是否为本次请求路径(与path进行equals比较).如果与本次请求
              路径一致则说明就是这个方法处理该请求,然后通过调用invoke执行该方法
              注意:执行后调用return结束.避免后续的分支继续执行

         */

        try {
            File dir=new File(
                    DispatcherServlet.class.getClassLoader().getResource("./com/webserver/controller").toURI()
            );
            File[] subs=dir.listFiles(f->f.getName().endsWith(".class"));
            for(File file:subs){
                String fileName = file.getName();
                String className = fileName.substring(0,fileName.indexOf("."));
                Class cls = Class.forName("com.webserver.controller."+className);
                if (cls.isAnnotationPresent(Controller.class)){
                    System.out.println(className+"被@Controller标注");
                    Method[]methods=cls.getDeclaredMethods();
                    for (Method method:methods){
                    if (method.isAnnotationPresent(RequestMapping.class)){
                        System.out.println("被@RequestMapping标注");
                        RequestMapping rmg=method.getAnnotation(RequestMapping.class);
                        String value=rmg.value();
                        if (value.equals(path)){
                            Object obj=cls.newInstance();
                          method.invoke(obj,request,response);
                          return;



                        }


                    }
                    }

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        File file = new File("./webapps" + path);
            if (file.isFile()) {//请求的是一个存在的文件
                response.setContentFile(file);
            } else {
                response.setStatusCode(404);
                response.setStatusReason("Not Found");
                file = new File("./webapps/root/404.html");
                response.setContentFile(file);
            }
        response.addHeader("Server","WebServer");
    }
}
